package com.lw.cas;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.atomic.AtomicStampedReference;

/**
 * @author LW
 * @2020/8/22 9:11
 */

/**
 * CAS:比较工作内存的值和主内存中的值，如果这个值是期望的，那么则执行操作，如果不是就一直循环（底层是自旋锁do...while）
 *
 * 缺点：1.循环会耗时  2.一次性只能保证一个共享变量的原子性   3.会存在ABA问题
 * ABA问题：
 * 主内存有一个a=1，两个工作拿走都运用了CAS，第一个工作内存CAS(1,2)，第二个工作内存CAS(1,3)和CAS(3,1)
 * 最终主内存拿到的还是a=1，！！！！只不过它居然不知道被骗了！这个a变过了几次
 */
public class CASDemo {
    /**
     * unsafe
     * java无法操作内存
     * java可以调用c++   “native”
     * c++可以操作内存
     * Unsafe类   java的后门，可以通过这个类操作内存
     */

    //CAS compareAndSet  :  比较并交换
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(2020);

        //期待更新
        //public final boolean compareAndSet(int expect,int update)
        //如果我的期望值达到了，那么久更新，否则，就不更新
        //==============捣乱的线程====================
        System.out.println(atomicInteger.compareAndSet(2020, 2021));
        System.out.println(atomicInteger.get());
        System.out.println(atomicInteger.compareAndSet(2021, 2020));
        System.out.println(atomicInteger.get());
        atomicInteger.incrementAndGet();

        //==============期望的线程====================
        //CAS是  CPU的原语
        System.out.println(atomicInteger.compareAndSet(2020, 2008));
        System.out.println(atomicInteger.get());
        /**
         * 三个都动过了，都是true
         * 所以我们希望谁动过了一定要告诉我
         * 所以这就跟乐观锁version相似了
         * 这里就需要原子引用：带版本号的原子操作AtomicReference
         *
         */


    }
}
